﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace DefensiveShield
{
    public static partial class OS
    {
        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- LOG MESSAGE ----------------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция логгирования сообщения
             * 
             * Каждое отдельное сообщение шифруется на глобальном ключе системы и сохраняется на новую строку в конец файла
             * 
             * Сообщение содержит в себе имя пользователя, строку с описанием события, опционально - строку описывающую, с каким файлом может быть связано данное событие, а так же дату и время сохранения события.
             * 
            @return код ошибки, при её наличии
        */
        public static ErrorCodes LogMessage(string userName, string action, string filePath = null)
        {
            try
            {
                File.AppendAllText(_logFullFileName, OS.Encrypt(userName + " " + action + " " + filePath + " " + DateTime.Now.ToString() + Environment.NewLine, GlobalKey));
                return ErrorCodes.NoError;
            }
            catch (Exception)
            {
                //MessageBox.Show(e.ToString());
                return ErrorCodes.UnknownLoggingError;
            }
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- GET ALL LOGGED MESSAGES-----
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция считывания логгированных событий
             * Данная функция открывает файл с логгированными событиями на чтение и одну за одной расшифровывает строки и добавляет в список, который она возвращает.
            @return List<string> - список сообщений
            @return null - в случае ошибки
        */
        public static List<string> GetAllLoggedMessages()
        {
            try
            {
                string line;
                var lst = new List<string>();
                var file = new StreamReader(_logFullFileName);
                while ( (line = file.ReadLine()) != null )
                {
                    lst.Add(OS.Decrypt(line, Users[AdministratorName].PasswdHash));
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- REMOVE LOG -----------------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция удаления лога
             * 
             * Данная функция удаляет файл с логгированными событиями
             * 
            @return код ошибки, при её наличии
        */
        public static ErrorCodes RemoveLog()
        {
            try
            {
                File.Delete(_logFullFileName);
                return ErrorCodes.NoError;
            }
            catch (Exception)
            {
                //MessageBox.Show(e.ToString());
                return ErrorCodes.ErrorDeletingLogFile;
            }
        }
    }
}
